# 改造Animal类，在不使用init方法的情况下，可以初始化，可以打印对象详细信息：
# 类似Car1(make='奥迪', model='A4', year='20240801', odometer=0)
from dataclasses import dataclass


@dataclass()
class Animal:
    """
    动物有如下属性：
    1.动物类型 type_animal
    2.动物颜色 color
    3.动物位置,x坐标 x_position
    4.动物位置,y坐标 y_position
    5.是否带特效: special_effect
    """
    type_animal: str
    color: str
    x_position: int
    y_position: int
    special_effect: bool

    # 在属性前面加两个下划线后，外部就不可见该属性，也就更安全
    __show: bool = True

    def get_show(self):
        return self.__show

    def set_show(self, show):
        self.__show = show

    def click_self(self):
        print("（{}，{}）位置的元素被点击了，并且左右晃动了一下".format(self.x_position, self.y_position))
        print("该元素是一个{}，{}的".format(self.type_animal, self.color))

    def change_position(self, another):
        x_position = another.x_position
        y_position = another.y_position
        another.x_position = self.x_position
        another.y_position = self.y_position
        self.x_position = x_position
        self.y_position = y_position


frag_1 = Animal("青蛙", "绿色", 5, 3, True)
fox_1 = Animal("狐狸", "红色", 2, 2, False)

# 属性外部可见，不安全，比别人拿到对象后就可以修改属性值
frag_1.x_position = 20
# frag_1.show = False

# 解决这个问题的方法：将属性私有化,通过提供对外访问的方法来访问
frag_1.set_show(False)

frag_1.click_self()
print(fox_1)
print(frag_1)